Google Sheets + Apps Script を使ってめそ子の壁紙を月替りで自動アップデートする
毎月アップロードされるめそ子さんの壁紙、いいですよね。今回は、新作の壁紙がアップされたら自分のmacbookに自動でアップデートする仕組みを考えてみました。
序論
めそ子の壁紙はこのページに更新されます。macの壁紙はAppleScriptおよびAutomatorでコントロールできるので、フォルダアクセスして最新ファイルを特定できたり、RSSなどのキッカケがあるならログインスクリプトの感覚で書いてmacの中だけで完結することができます。→ Set Desktop to NASA Astronomy Picture of the Day
ページのhtmlをみてみましょう。
[gist id="ed111c91403980240d3e5d7ae8769eef"]
どうやら https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2016/09/ がアップロードフォルダのようです。覗いてみましょう。
怒られました。そんなに甘くないです。
しかもよくよく見ると、
Mesoko_May_1920x1080.png
mesoko_apr_1920x1080.png
Mesoko_Mar1280x1024.png
めそ子さんは気分でファイルを命名しているようです。
ここは社内的にめそ子さんにパブリックアクセスできるフォルダに連番でファイルをアップしてくださいと頼めばいいのですが、新入社員がそんなこと言えるわけありません。
こうなると、htmlを頭からスキャンして正規表現でその月のファイルURLを特定してダウンロード、のような力業が必要になって来ますが、ループ処理などをAppleScriptでどうやって書けばいいのか知りませんし、正規表現が苦手なのでやりたくもありません。
そこでイマドキのツールを駆使してできるだけコーディングせずにやり過ごす方法を考えます。
強力なGoogle Sheets
htmlはあまねく構造化データです。タグの入れ子構造を分析すれば、要素がどのように並んでいるかという規則性を見いだすことができます。
Google Sheetsはデータ構造を可視化して加工しやすくする強力なWebインポート機能を備えていて、IMPORTXML 関数を使うとXPathという構文でクエリを記述できます。めそ子ページでたどり着きたいタグを「/」 で、属性を「@」で区切って下記のような引数をそろえます。
=IMPORTXML("https://dev.classmethod.jp/etc/mesoko-helloworld/","//table/tbody/tr/td/p/a/@href")
一発です。一番上が最新月の一番解像度の高い画像ファイルURLになります。
使い勝手のいいBox
macで壁紙に設定するフォルダとファイルを指定し、スリープ解除をきっかけとしてファイルをチェックして壁紙を更新できるようにします。
ファイルはGoogle Sheetsで特定したURLからダウンロードして、ここに指定したフォルダに上書き更新します。つまりこれはネットワーク共有フォルダで、macにマウントされています。
クラウドストレージサービスは数あれど、端末にマウントする用途ではBoxは非常によくできたプロダクトです。Googleのサービスを使うならばGoogle Driveをまず検討すべきですが、
- Google DriveやDropboxなどは同期をメインにしたプロダクトで、端末にネットワークドライブとしてマウントするにはサードパーティーのアプリケーションが必要になる。
- Google Driveはシンボリックリンクが使えない。
- Boxは共有方法が多様で、かつ高度な権限設定が行える。
- その共有方法の一つとして、フォルダ固有のメールアドレス宛に添付ファイルを送付してアップロードすることができる。
といった点から、今回はBoxを選択しました。
thismonth.pngという名前で、4月のファイルを置きます。
Google Apps Scriptで定期実行
あとはGoogle Sheetの一番左上にあるURLからファイルをダウンロードして添付ファイルでBoxにメール送信するだけです。
Google Apps Script(GAS)はDevelopers.IOでもよく取り上げられていますが、
- JavaScriptの文法で書けるサーバーサイドスクリプト。
- とはいえNode.jsのようにサーバーを用意する必要がない。
- Googleのサービスとの連携が当然ながらシンプル。(個人的にはSheetsの独自関数を作成できるのが素敵)
- 定期実行の設定が簡単。
といった特徴があります。処理の自動化やAPIプログラミングにはうってつけのサービスですが、
- 外部との接続は関数の実行ごとにIPアドレスが変わるため、常時接続のStreaming APIなどは利用できない。
- GASで作られたライブラリを読み込んで利用することができるが、npmのような膨大な資産はない。
- まともに使えるJavaScriptライブラリはJQueryくらいで、高度な記述には向かない。
- GASで作ったプロジェクトをREST API化することができるが、Google認証なしで使う場合One timeのURLでリダイレクトされるので、利用する側にリダイレクトフォローの記述が必要になる。
と、複雑なことをやろうとすると深みにはまってしまうので、せいぜい50行程度に収まる簡単な処理に使うのが良いでしょう。
よってコードはとてもシンプルです。Google Sheetsのツール→スクリプトエディタからGASを起動して以下のように書きます。
[gist id="ff5f893f64bdb28ee1363a2895733e3c"]
UrlFetchApp.fetchというWebインポートや、MailApp.sendEmailといったGmailを使うメソッドが用意されているため、記述量はJavaScriptと比較しても少ないかと思います。実行して、スリープ→スリープ解除してみましょう。
はい。5月の壁紙に替わりました。
5月… めそ子さんが2代目になってからまだ壁紙の更新がないです…
これをGASのトリガーボタンを押して、1日1回定期実行するようにしておきます。
これでいつ最新作がアップされてもOKです。めそ子さん、楽しみに待ってます。
クラスメソッドで、ヨーロッパリージョンで勤務しませんか? クラスメソッドでは、日本、バンクーバー、ベルリンで一緒に働く仲間を募集しています! 採用情報 | クラスメソッド株式会社